﻿#include <iostream>
#include <bitset>	//输出二进制值
#include <string>
#include <string_view>

//内联函数
inline int max(int a, int b) {
	return a > b ? a : b;
}


//constexpr函数，其返回值可以在编译时计算
constexpr int greater(int x, int y) // 是一个 constexpr 函数
{
	return (x > y ? x : y);
}



//C++20引入了关键字consteval，用于指示函数必须在编译时求值，
//consteval int greater(int x, int y) // function 现在是 consteval
//{
//	return (x > y ? x : y);
//}


// str 提供了传入参数的只读访问能力
//std::string_view最好用作只读函数参数
void printSV(std::string_view str) // str现在是 std::string_view
{
	std::cout << str << '\n';
}

int main()
{
	std::cout << "Hello World!\n";

	//申明常量：常数是在程序执行期间不能更改的值
	const double gravity{ 9.8 };  // 更推荐将 const 放在类型前

	//constexpr关键字修饰变量（“常量表达式”的缩写），则变量只能是编译时常量。
	constexpr double constexprVar{ 9.8 }; // ok: 9.8 是常量表达式

	//各种进制的使用
	int x{ 012 }; // 0 开头的数据在C++中代表八进制
	std::cout << x << '\n';
	x = 0xF; // 0x 开头的数据在C++中代表十六进制
	std::cout << x << '\n';
	x = 0b1;        // 将二进制 0000 0000 0000 0001 设置给变量
	std::cout << x << '\n';
	x = 0b1011'0010;  // 使用引号（’）作为数字分隔符将二进制 1011 0010 设置给变量,
	std::cout << x << '\n';
	x = 123;  // 常规10进制,
	std::cout << x << '\n';

	//输出二进制值
	// std::bitset<8> 意味着要存储 8 个 bit
	std::bitset<8> bin1{ 0b1100'0101 }; // 二进制的 1100 0101
	std::bitset<8> bin2{ 0xC5 }; // 十六进制的 1100 0101

	std::cout << bin1 << '\n' << bin2 << '\n';
	std::cout << std::bitset<4>{ 0b1010 } << '\n'; // 创建一个临时的bitset并打印


	int xx{ 2 };
	int yy{ 1 };
	int zz{ 10 - xx > yy ? xx : yy }; //条件运算符 ? :
	std::cout << zz;


	//调用内联函数
	std::cout << "内联函数:" << max(23, 34) << '\n';
	std::cout << "内联函数:" << max(99, 27) << '\n';


	//constexpr函数，其返回值可以在编译时计算
	std::cout << "constexpr函数:" << greater(99, 27) << '\n';


	//使用字符串，string可以做的最整洁的事情之一是保存不同大小的字符串
	std::string name{ "Fly" };
	std::cout << "My name is: " << name << '\n';


	std::cout << "输入一行字符串: ";
	std::string str{};
	//std::ws输入操纵器告诉std::cin在提取之前忽略任何前导空格。
	// 前导空格是出现在字符串开头的任何空格字符（空格、制表符、换行符）。
	std::getline(std::cin >> std::ws, str); // 将一整行输入读取到 
	std::cout << "输入一行字符串的内容:" << str << '\n';

	//仅查看，不修改，std::string_view最好用作只读函数参数
	printSV("你好");

	return 0;
}
